package com.stonedt.spider.scheduled;

import com.alibaba.fastjson.JSONObject;
import com.stonedt.spider.entity.SpiderFlow;
import com.stonedt.spider.service.SpiderFlowService;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 爬虫定时执行管理
 *
 * @author Administrator
 */
@Component
public class SpiderJobManager {

	//private static Logger logger = LoggerFactory.getLogger(SpiderJobManager.class);

	private final static String JOB_NAME = "OPEN_SPIDER_TASK";

	public final static String JOB_PARAM_NAME = "OPEN_SPIDER_FLOW";

	// 用来存储待执行的爬虫
//    public volatile static Map<String, Map<Integer, Map<String, Object>>> spiderList = new ConcurrentHashMap<>();

	public volatile static List<String> cronList = new ArrayList<String>();

	@Autowired
	private SpiderFlowService spiderFlowService;

	private static SpiderJob spiderJob;

	/**
	 * 调度器
	 */
	private Scheduler scheduler;

	{
		try {
			scheduler = new StdSchedulerFactory().getScheduler();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	@PostConstruct
	public void initSpiderJob() {
		if (!SpiderJob.SPIDERJOBSTATUS) {
			return;
		}

		spiderJob.spiderFlowService=this.spiderFlowService;
		// 查询所有开启定时任务的爬虫
//        List<Map<String, Object>> selectList = spiderFlowService.selectSpiderListJob();
		cronList = spiderFlowService.selectSpiderListJob_mysql();
//        for (Map<String, Object> map : selectList) {
////        	System.out.println(JSONObject.toJSONString(map));
//            if (map.get("cron") != null) {
//                //通过cron判断该分组是否存在
//                Map<Integer, Map<String, Object>> cron = spiderList.get(map.get("cron"));
//                //分组不存在
//                if (cron == null) {
//                    cron = new ConcurrentHashMap<>();
//                }
//                cron.put(Integer.parseInt(map.get("id").toString()), map);
//                spiderList.put(map.get("cron").toString(), cron);
//            }
//        }
		// 添加定时任务
		for (String cron : cronList) {
			if (cron.equals("0 20 0/2 * * ?")) {
				addJob("0 30 9-22/4 * * ?");
			} else {
				addJob(cron);
			}
		}
	}

	/**
	 * 新建定时任务
	 *
	 * @param cron 表达式
	 * @return boolean true/false
	 */
	public Date addJob(String cron) {
		System.out.println("addJob>>>>> "+cron);
		try {
			if (!SpiderJob.SPIDERJOBSTATUS) {
				return null;
			}
			JobDetail job = JobBuilder.newJob(SpiderJob.class).withIdentity(getJobKey(cron)).build();
			job.getJobDataMap().put(JOB_PARAM_NAME, cron);

			CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron)
					.withMisfireHandlingInstructionDoNothing();

			CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(cron))
					.withSchedule(cronScheduleBuilder).build();

			Date date = scheduler.scheduleJob(job, trigger);
			scheduler.start();
			return date;
		} catch (SchedulerException e) {
			//logger.error("创建定时任务出错", e);
			return null;
		}
	}

	private JobKey getJobKey(String id) {
		return JobKey.jobKey(JOB_NAME + id);
	}

	private TriggerKey getTriggerKey(String id) {
		return TriggerKey.triggerKey(JOB_NAME + id);
	}

	public boolean remove(String id) {
		try {
			scheduler.deleteJob(getJobKey(id));
//            spiderList.remove(id);
			return true;
		} catch (SchedulerException e) {
			//logger.error("删除定时任务失败", e);
			return false;
		}
	}

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 10:24
//     * 传入一个cron 表达式 判断是否在内存中   不存在 默认 不运行
//     * @since
//     */
//    public boolean isJobRun(String cron) {
//        Map<Integer, Map<String, Object>> run = spiderList.get(cron);
//
//        if (run != null) {
//            return true;
//        }
//        return false;
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 10:39
//     * 将传过来的spiderflow对象放到内存里面
//     * @since Map<String, List < Map < Integer, Map < String, Object>>>>
//     */
//    public boolean addList(SpiderFlow spiderFlow) {
//        try {
//        	if(!SpiderJob.SPIDERJOBSTATUS){
//    			return false;
//    		}
//            String jsonString = JSONObject.toJSONString(spiderFlow);
////            System.out.println(jsonString);
//            Map<String, Object> map = JSONObject.parseObject(jsonString, Map.class);
//            Map<Integer, Map<String, Object>> run = spiderList.get(spiderFlow.getCron());
//            if (run == null) {
//                run = new ConcurrentHashMap<>();
//            }
////            System.out.println(JSONObject.toJSONString(map));
//            run.put(spiderFlow.getId(), map);
//            spiderList.put(spiderFlow.getCron(), run);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//
//    }

//    public boolean addList(Map<String, Object> spiderFlow) {
//        try {
//        	if(!SpiderJob.SPIDERJOBSTATUS){
//    			return false;
//    		}
//            Map<Integer, Map<String, Object>> run = spiderList.get(spiderFlow.get("cron"));
//            if (run == null) {
//                run = new ConcurrentHashMap<>();
//            }
//            run.put((Integer) spiderFlow.get("id"), spiderFlow);
//            spiderList.put(spiderFlow.get("cron").toString(), run);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 10:46
//     * 删除内存中的spiderFlow对象
//     * @since
//     */
//    public boolean removeList(int id, String cron) {
//        try {
//            if (spiderList == null || spiderList.size() == 0) {
//                return true;
//            }
//            Map<Integer, Map<String, Object>> maps = spiderList.get(cron);
//            if (maps == null || maps.size() == 0) {
//                return true;
//            }
//            maps.remove(id);
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 11:03
//     * 判断内存中是否存在spideflow配置
//     * @since
//     */
//    public boolean isList(int id, String cron) {
//
//        Map<Integer, Map<String, Object>> maps = spiderList.get(cron);
//        if (maps == null)
//            return false;
//
//        Map<String, Object> map = maps.get(id);
//        if (map == null) return false;
//        return true;
//
//    }

//    /**
//     * @return
//     * @throws
//     * @author dxk
//     * @date 2021/4/19 11:13
//     * 判断cron表达式在内存中是否还有配置
//     * @since
//     */
//    public boolean isListHave(String cron) {
//        Map<Integer, Map<String, Object>> maps = spiderList.get(cron);
//
//        if (maps == null || maps.size() == 0)
//            return false;
//
//        return true;
//    }
}
